import 'dart:math';

import 'package:flutter/cupertino.dart';

class StringUtil {
  /// numberToUnitStr 数字转换单位字符串
  /// @param  {Number} number 需要转换的字符
  /// @return {String}        返回转换后的字符串
  ///
  static String numberToUnitStr(int number) {
    if (number >= 1e10) {
      // 1百亿及以上 显示为xxx亿，如：123亿（12345678901）
      return '${(number / 1e8).toStringAsFixed(0)}亿';
    } else if (number >= 1e8) {
      // 1亿到1百亿 显示成xx.x亿，如：12.3亿（1234567890）
      return '${(number / 1e8).toStringAsFixed(2)}亿';
    } else if (number >= 1e6) {
      // 100万到1亿之间显示成xxx万，如：1234万（12345678）
      return '${(number ~/ 1e4).toStringAsFixed(0)}万';
    } else if (number >= 1e5) {
      // 10万到100万之间，显示成xx.x万，如：12.3万（123456
      return '${(number / 1e4).toStringAsFixed(1)}万';
    }

    // 10万以内直接显示 如：12345
    return number.toString();
  }

  /// @function exchangeRMB 转换
  /// @params {int} totalScore
  /// @params {int} rate
  /// @return {String}
  static String exchangeRMB(int totalScore, int rate) {
    return (totalScore / rate).toStringAsFixed(2);
  }

  /// @function encodePhone
  /// @params {dynamic} phone
  /// @return {String}
  static String encodePhone(dynamic phone, {start = 3, end = 7}) {
    int pad = max(end - start, 0);
    return (phone ?? '')
        .toString()
        .replaceRange(start, end, ''.padLeft(pad, '*'));
  }

  /// [formatDate 格式化显示日期时间]
  /// @param  {[String | Number]} date [待显示的日期时间，可以为数字形式]
  /// @param  {[String]} fmt [需要显示的格式，例如yyyy-MM-dd hh:mm:ss]
  /// @return {[String]}   [格式化好的时间]
  static String formatDate(dynamic date, [String fmt = 'yyyy-MM-dd hh:mm:ss']) {
    DateTime dateTime = DateTime(1000);
    if (date.runtimeType == int) {
      dateTime = DateTime.fromMillisecondsSinceEpoch(date);
    } else if (date.runtimeType == String) {
      dateTime = DateTime.parse(date);
    }
    Map<String, int> o = {
      'y': dateTime.year,
      'M': dateTime.month + 1,
      'd': dateTime.day,
      'h': dateTime.hour,
      'm': dateTime.minute,
      's': dateTime.second,
      'w': dateTime.weekday // 当前星期
    };
    RegExp reg = RegExp(r'y+|M+|d+|h+|m+|s+|w+');
    try {
      return fmt.replaceAllMapped(reg, (match) {
        String? item = match.group(0);
        int? len = item?.length;
        String? first = item?.substring(0, 1);
        String fillZero = (len! > 0 ? '0' : '') + o[first].toString();
        debugPrint('==formatDate===>item:$item, len:$len, fillZero:$fillZero');
        return fillZero.substring((fillZero.length > len && len > 0) ? 1 : 0);
      });
    } catch (e) {
      debugPrint(e.toString());
      return '';
    }
  }

  /// 1s = 1000ms
  /// 1m = 60 * 1000ms
  /// 1h = 60 * 60 * 1000
  /// 1d = 24 * 60 * 60 * 1000
  ///
  /// [getTimeSpan 转换阶梯时间]
  /// @param  {[Number]} date [时间戳]
  /// @param  {[String]} fmt [需要显示的格式，例如yyyy-MM-dd hh:mm:ss]
  /// @return {[String]}      [转换后的时间字符串]
  static String getTimeSpan(dynamic date, [String fmt = 'yyyy-MM-dd']) {
    DateTime dateTime;
    if (date.runtimeType == int) {
      if (date.toString().length == 10) {
        date = date * 1000;
      }
      dateTime = DateTime.fromMillisecondsSinceEpoch(date);
    } else {
      dateTime = DateTime.parse(date);
    }
    int current = DateTime.now().millisecondsSinceEpoch;
    int timestamp = dateTime.millisecondsSinceEpoch;
    // 差值
    int differe = current - timestamp;

    if (differe > 0) {
      if (differe > 864e6) {
        // 10天前，显示mm.dd hh: mm（例：04.05 16:05）
        // return this.formatDate(timestamp, 'mm.dd hh:mm')
        return formatDate(timestamp, fmt);
      } else if (differe > 2592e5) {
        // 小于10天（含10天），显示x天前；
        return '${numberFloor(differe / 864e5)}天前';
      } else if (differe > 1728e5) {
        // 2天到3天之前前天；
        return '前天';
      } else if (differe > 864e5) {
        // 1天到2天之间，显示昨天；
        return '昨天';
      } else if (differe > 36e5) {
        // 小于一天，显示x小时前；
        return '${numberFloor(differe / 36e5)}小时前';
      } else if (differe > 6e4) {
        // 小于1小时，显示x分钟前；
        return '${numberFloor(differe / 6e4)}分钟前';
      }

      // 小于1分钟，显示“刚刚”；
      return '刚刚';
    } else {
      return formatDate(timestamp, fmt);
    }
  }

  static String numberFloor(double number) {
    return number.floor().toString();
  }
}
